// Package jwt 处理 JWT 认证
package jwt

import (
	"time"

	"github.com/golang-jwt/jwt"
)

var secretKey = []byte("lwl")

// ParseToken 解析请求头中的 token string，转换成被解析后的 jwt.Token
func ParseToken(tokenStr string) (*jwt.Token, error) {
	var tokenType = "Bearer "
	token := tokenStr[len(tokenType):]
	// 解析 token string 拿到 token jwt.Token
	return jwt.ParseWithClaims(token, &AuthClaims{}, func(tk *jwt.Token) (interface{}, error) {
		return secretKey, nil
	})
}

// AuthClaims 是 claims struct
type AuthClaims struct {
	UserName string `json:"user_name"`
	jwt.StandardClaims
}


// GenerateToken 一般在登录之后使用来生成 token 能够返回给前端
func GenerateToken(userName string, expireTime time.Time) (string, error) {
	// 创建一个 claim
	claim := AuthClaims{
		UserName: userName,
		StandardClaims: jwt.StandardClaims{
			// 过期时间
			ExpiresAt: expireTime.Unix(),
			// 签名时间
			IssuedAt: time.Now().Unix(),
			// 签名颁发者
			Issuer: "lwl",
			// 签名主题
			Subject: "last",
		},
	}

	// 使用指定的签名加密方式创建 token，有 1，2 段内容，第 3 段内容没有加上
	noSignedToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claim)

	// 使用 secretKey 密钥进行加密处理后拿到最终 token string
	return noSignedToken.SignedString(secretKey)
}
